#if !defined(_APP_BUFFER)
#define _APP_BUFFER
#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>

// 子缓冲区结构体
typedef struct {
    char *data; // 数据
    int len; //当前数据长度
	int total_size; //总长度
} sub_buffer_t;

// 主缓冲区 结构体
typedef struct {
	sub_buffer_t *sub_buffer[2];
	int read_index;
	int write_index;
	pthread_mutex_t	 read_lock;
	pthread_mutex_t	 swap_lock;
} buffer_t;


/**
 * @brief 缓冲区初始化
 * @param total_size 缓冲区总大小  因为是双缓冲结构 所以总大小为2倍
 * @return 主缓冲区指针
 * 	创建两个缓冲区 放入主缓冲区结构体 返回
 */
buffer_t  *app_buffer_init(int total_size);

/**
 * @brief 向缓冲区写入数据
 * @param buffer 主缓冲区指针
 * @param data 写入的数据
 * @param len 写入的数据长度
 * @return 成功 0   失败-1
 * 
 * 1   判断是否可以写入数据 比较写入长度和剩余空间
 * 2   如果可以写入数据  2.1 向尾部拷贝数据 2.2 更新当前数据长度
 * 
 */
int app_buffer_write(buffer_t *buffer, char *data, u_int8_t len);


/**
 * @brief 从缓冲区读取数据
 * @param buffer 主缓冲区指针
 * @param buff 读取数据的容器 （已开辟空间）
 * @param buff_len 读取数据的容器长度
 * @return  实际读取数据的长度
 * 
 * // 1 判断容器是否够放一条数据  比较 容器长度和数据长度
 * // 2 判断当前读缓冲是否为空 要做切换
 * // 3 读取数据  3.1 从缓冲区开头位置读取一条数据 3.2从从缓冲区删除数据 3.3 调整缓冲区长度
 * // 4 如果读缓冲区已空 进行切换 
 */
int app_buffer_read(buffer_t *buffer, char *read_buff, int buff_len);


// 销毁缓冲区
// 释放子缓冲区数据 在释放主缓冲区
void app_buffer_destroy(buffer_t *buffer);

#endif // _APP_BUFFER
